1225. Флаги

 

Флаг состоит из n вертикальных полос белого, красного и синего цвета. Соседние полосы не могут иметь одинаковый цвет, а синяя полоса всегда должна находиться между красной и белой. Сколькими способами можно покрасить флаг из n полос?

 

Вход. Число полос n (1 £ n £ 45) на флаге.

 

Выход. Количество способов, которыми можно покрасить флаг из n полос.

 

Пример входа

3

 

Пример выхода

4

 

 

РЕШЕНИЕ

числа Фибоначчи

 

Анализ алгоритма

Обозначим через fred(n) и fwhite(n) количество способов раскраски флага из n полос при условии, что первой полосой будет соответственно красная или белая. Тогда

fred(n) = fwhite(n – 1) + fwhite(n – 2), fred(1) = 1, fred(2) = 1;

fwhite(n) = fred(n – 1) + fred(n – 2), fwhite(1) = 1, fwhite(2) = 1.

Если f(n) – искомое общее количество способов раскраски, то

f(n) = fred(n) + fwhite(n)

Поскольку fred(1) = fwhite(1) = 1, fred(2) = fwhite(2) = 1, а fred(n) и fwhite(n) одинаковыми формулами выражаются друг через друга, то fred(n) = fwhite(n) = fn, где fnn-ое число Фибоначчи. Таким образом f(n) = 2 * fn.

 

Реализация алгоритма

В массиве fib вычислим значения fred(n): fred(n) = fib[n]. Для n > 44 значения fred(n) будут выходить за границы типа int, поэтому воспользуемся 64 - битовым целочисленным типом __int64.

 

__int64 fib[46];

 

Читаем входное значение n. Нахождение значения fib[n] совершим в цикле:

 

scanf("%d",&n);

fib[1] = 1; fib[2] = 1;

for(i=3;i<=n;i++) fib[i] = fib[i-1] + fib[i-2];

 

Выводим результат f(n) = 2* fred(n) = 2 * fib[n]:

 

printf("%I64d\n",2*fib[n]);